package com.tianlang.security;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.stereotype.Component;

import com.tianlang.cache.Cache;

/**
 * 
 * 自定义 资源与权限对应关系 此类在初始化时，应该取到所有资源及其对应角色的定义
 * 最核心的地方，就是提供某个资源对应的权限定义，即getAttributes方法返回的结果。 此类在初始化时，应该取到所有资源及其对应角色的定义。
 * 
 * @author mchp
 */
@Component
public class MySecurityMetadataSource implements FilterInvocationSecurityMetadataSource {

	private static Map<String, Collection<ConfigAttribute>> resourceMap = Cache.resourceMap;

	/**
	 * 构造方法会先于注入执行,所以loadResourceDefine方法放入构造中执行时函数内的service与mapper还未执行注入，因此报
	 * java.lang.NullPointerException的异常。
	 * 解决方法是将loadResourceDefine方法放在getAttributes方法中执行
	 */
	public MySecurityMetadataSource() {
		// loadResourceDefine();
	}

	@Override
	public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
		// object 是一个URL，被用户请求的url
		FilterInvocation filterInvocation = (FilterInvocation) object;
		Iterator<String> ite = resourceMap.keySet().iterator();
		while (ite.hasNext()) {
			String requestURL = ite.next();
			RequestMatcher requestMatcher = new AntPathRequestMatcher(requestURL);
			if (requestMatcher.matches(filterInvocation.getHttpRequest())) {
				return resourceMap.get(requestURL);
			}
		}
		return null;
	}

	@Override
	public Collection<ConfigAttribute> getAllConfigAttributes() {
		return null;
	}

	@Override
	public boolean supports(Class<?> clazz) {
		return true;
	}

}